<?php
/**
 * 
 * @author 徐文振 - YcoeXu
 */
class ACLHelper {
	var $acl_item_regx = '/^(.*):(\d+)$/i';
	/**
	 * 解析权限字符串
	 * @param string $acl_str
	 */
	public static function parse($acl_str){
		if(empty($acl_str)){
			return array();
		}
		return unserialize($acl_str);
	}
	
	/**
	 * 检查是否有权限
	 * @param string $namespace 命名空间
	 * @param int $acl 权限值
	 * @param string $user_acl_str 用户权限字符串，如果未提供，则直接使用当前用户的权限
	 */
	public static function check($namespace, $acl, $user_acl_str){
		if(is_numeric($user_acl_str)){
			$acl_array = array(
				$namespace => $user_acl_str,
			);
		}else{
			$acl_array = ACLHelper::parse($user_acl_str);
			if(!array_key_exists($namespace, $acl_array)){
				return false;
			}
		}
		$f_acl = pow(2, $acl);
		$user_acl = $acl_array[$namespace];
		return ($user_acl & $f_acl) == $f_acl;
	}
	
	/**
	 * 两权限字符串相加
	 * @param string $acl_str_1 比如：site:23,user:1
	 * @param string $acl_str_2
	 */
	public static function add($acl_str_1, $acl_str_2){
		$acl_array_1 = $this->parse($acl_str_1);
		$acl_array_2 = $this->parse($acl_str_2);
		foreach($acl_array_1 as $namespace=>$acl){
			if(array_key_exists($namespace, $acl_array_2)){
				//存在相同的
				$acl_array_1[$namespace] = ($acl_array_2[$namespace] | $acl);
			}
		}
		foreach($acl_array_2 as $namespace=>$acl){
			if(!array_key_exists($namespace, $acl_array_1)){
				//如果不存在
				$acl_array_1[$namespace] = $acl;
			}
		}
		return $acl_array_1;
	}
	
	/**
	 * 计算权限值，一般是从页面直接Post的数据过来的
	 * @param array $acl_array 比如：array('site'=>array(1,3), 'user'=>array(3))
	 */
	public static function parse_acl_array($acl_array){
		if(empty($acl_array))
			return array();
		$acls = array();
		foreach ($acl_array as $namespace=>$acl_values){
			if(empty($acl_values))
				continue;
			$acl_v = 0;
			foreach($acl_values as $acl_value){
				$acl_v += pow(2, $acl_value);
			}
			$acls[$namespace] = $acl_v;
		}
		return $acls;
	}
	
	/**
	 * 将权限数组转换成权限字符串
	 * @param array $acl_array 
	 */
	public static function to_string($acl_array){
		return serialize($acl_array);
	}
	
	/**
	 * 格式化权限，本方法做两件事：
	 * 1. 将用户权限与网站权限进行交集计算，以保证不会出现网站没有的权限
	 * 2. 对用户权限进行计算，将有权限的项标识出来，方便界面调用
	 * @param unknown_type $acls
	 * @param unknown_type $user_acl
	 * @param unknown_type $site_acl 网站权限，如果存在，则进行网站权限与平台权限的交集计算
	 */
	public static function format_acls_checkbox(&$acls, $user_acl=null, $site_acl=null){
		//与网站权限进行交集计算
		if(!empty($site_acl)){
			foreach($acls as $namespace=>$namespace_info){
				if(isset($site_acl[$namespace])){
					foreach($namespace_info['items'] as $key=>$acl){
						if(empty($acl)){
							unset($acls[$namespace]['items'][$key]);
							continue;
						}
						if(!ACLHelper::check($namespace, $key, $site_acl[$namespace])){
							unset($acls[$namespace]['items'][$key]);
						}
					}
					if(count($acls[$namespace]) == 0){
						unset($acls[$namespace]);
					}
				}else{
					unset($acls[$namespace]);
				}
			}
			reset($acls);
		}
		if($user_acl!==null){
			foreach($acls as $namespace=>$namespace_info){
				if(isset($user_acl[$namespace])){
					foreach($namespace_info['items'] as $key=>$acl){
						if(empty($acl))continue;
						$acls[$namespace]['items'][$key]['attr'] = ACLHelper::check($namespace, $key, $user_acl[$namespace])?'checked=\'checked\'':'';
					}
				}
			}
		}
	}
}

?>